import { Drive_blob_path } from "@/lib/drive_server" import { NextRequest, NextResponse } from "next/server" import { createReadStream, statSync } from "fs" import path from "path" export async function GET( request: NextRequest, { params }: { params: Promise<{ blobId: string }> } ) { try { const { blobId } = await params const { searchParams } = new URL(request.url) const filename = searchParams.get('filename') || 'download' // Get the filesystem path for this blob const blobPath = await Drive_blob_path(blobId) // Get file stats const stats = statSync(blobPath) const fileSize = stats.size // Determine content type based on file extension const ext = path.extname(filename).toLowerCase() const contentType = getContentType(ext) // Create readable stream const stream = createReadStream(blobPath) // Convert stream to web stream const readableStream = new ReadableStream({ start(controller) { stream.on('data', (chunk: Buffer | string) => { const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk) controller.enqueue(new Uint8Array(buffer)) }) stream.on('end', () => { controller.close() }) stream.on('error', (error) => { controller.error(error) }) } }) return new NextResponse(readableStream, { headers: { 'Content-Type': contentType, 'Content-Length': fileSize.toString(), 'Content-Disposition': `attachment; filename="${filename}"`, 'Cache-Control': 'public, max-age=31536000', // Cache for 1 year }, }) } catch (error) { console.error('Error serving blob:', error) return new NextResponse('File not found', { status: 404 }) } } function getContentType(extension: string): string { const mimeTypes: Record = { '.pdf': 'application/pdf', '.txt': 'text/plain', '.md': 'text/markdown', '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', '.doc': 'application/msword', '.zip': 'application/zip', '.png': 'image/png', '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.gif': 'image/gif', '.svg': 'image/svg+xml', '.css': 'text/css', '.js': 'application/javascript', '.json': 'application/json', '.html': 'text/html', '.htm': 'text/html', } return mimeTypes[extension] || 'application/octet-stream' }